//
// 数据重发队列，发送的数据先放到里来，自动启动重发
// 重发超过次数就，回调给超时处理
// Created by kenny on 25-10-27.
//

#ifndef MCP_RETRY_MANAGER_H
#define MCP_RETRY_MANAGER_H

#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include "mcp_decode.h"

#ifdef _WIN32
    #include <windows.h>
#else
    #include <pthread.h>
#endif

// 重发配置
#define MAX_RETRY_COUNT 3
#define RETRY_INTERVAL_MS 3000

// 重发记录状态
typedef enum {
    RETRY_PENDING = 0,    // 等待响应
    RETRY_SENT,          // 已发送
    RETRY_ACKED,         // 已确认
    RETRY_FAILED         // 失败
} retry_status_t;

// 重发记录
typedef struct {
    uint16_t sequence;           // 序列号
    uint32_t origin_sequence;    // 用户序列号
    uint8_t* packet_data;        // 数据包内容
    uint16_t packet_length;      // 数据包长度
    time_t send_time;            // 发送时间
    int retry_count;             // 当前重试次数
    retry_status_t status;       // 状态
    void* user_data;             // 用户数据（可选）
    // 重试回调函数，发送逻辑现这里实现
    void (*retry_callback)(uint16_t sequence, uint8_t* packet_data,uint16_t packet_length, void* user_data);
    void (*success_callback)(uint16_t sequence, void* user_data);
} retry_record_t;

// 重发管理器
typedef struct {
    retry_record_t* records;             // 重发记录数组
    int max_records;                     // 最大记录数
    int record_count;                    // 当前记录数

#ifdef _WIN32
    HANDLE timer_thread;
    CRITICAL_SECTION lock;
#else
    pthread_t timer_thread;
    pthread_mutex_t lock;
#endif
    bool running;
    // 全局回调函数, 服务端未响应，要重发
    void (*on_no_response)(uint16_t sequence, int retry_count);
    // 全局回调函数，已重试多遍，服务端均未响应，判断定发送失败
    void (*on_message_timeout)(uint16_t sequence);
} mcp_retry_manager_t;

// API 函数
int mcp_retry_manager_init(mcp_retry_manager_t* manager, int max_records);
void mcp_retry_manager_cleanup(mcp_retry_manager_t* manager);

int mcp_retry_manager_add_message(mcp_retry_manager_t* manager,
                                 uint16_t sequence,
                                 const uint8_t* packet_data,
                                 uint16_t packet_length,
                                 void (*retry_callback)(uint16_t sequence, uint8_t* packet_data,uint16_t packet_length, void* user_data),
                                 void (*success_callback)(uint16_t sequence, void* user_data),
                                 void* user_data);

int mcp_retry_manager_handle_response(mcp_retry_manager_t* manager, uint16_t sequence);
int mcp_retry_manager_remove_message(mcp_retry_manager_t* manager, uint16_t sequence);

void mcp_retry_manager_set_callbacks(mcp_retry_manager_t* manager,
                                    void (*on_no_response)(uint16_t sequence, int retry_count),
                                    void (*on_message_timeout)(uint16_t sequence));

// 内部函数（供网络模块调用）
int mcp_retry_manager_resend_message(mcp_retry_manager_t* manager, uint16_t sequence);
void mcp_retry_manager_check_timeouts(mcp_retry_manager_t* manager);

#endif // MCP_RETRY_MANAGER_H